package br.unicamp.ic.sgct.client.apresentacao.ucs;

import br.unicamp.ic.sgct.client.apresentacao.MyConstants;
import br.unicamp.ic.sgct.client.apresentacao.views.ViewInscricaoUsuarioConferencia;
import java.util.List;


import br.unicamp.ic.sgct.client.aplicacao.conferencia.ConferenciaListener;
import br.unicamp.ic.sgct.client.aplicacao.usuario.UsuarioListener;

import br.unicamp.ic.sgct.client.apresentacao.views.ViewListaConferencia;
import br.unicamp.ic.sgct.client.apresentacao.widgets.ButtonCampoForm;
import br.unicamp.ic.sgct.client.dominio.to.ConferenciaTO;
import br.unicamp.ic.sgct.client.dominio.to.UsuarioTO;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.DecoratedTabPanel;

public class InscricaoScreen extends BaseConferenciaScreen {

    private ConferenciaTO conferencia = null;
    private List<UsuarioTO> participacoesConferencia = null;
    private UsuarioTO usuario = null;
    private String username = null;
    private UsuarioListener controladoraUsuario = null;
    private ConferenciaListener controladoraConferencia = null;
    private MyConstants myConstants = (MyConstants) GWT.create(MyConstants.class); 
    //
    private ViewListaConferencia viewListaConferencia = new ViewListaConferencia(myConstants.conferenciaAberta(), 0,
            new ViewListaConferencia.HandlerClickListaConferencia() {

                private void montaInscricaoUsuario(UsuarioTO usuarioTemp) {
                    usuario = usuarioTemp;
                    viewInscricaoUsuarioConferencia.montar(usuario, participacoesConferencia, conferencia.getAreas());
                    panelTabOpcoes.selectTab(1);
                    showLoading(false);
                }

                private void obterUsuarioMontaInscricaoUsuario() {
                    controladoraUsuario.obterUsuario(new UsuarioListener.HandlerObterUsuario() {

                        @Override
                        public void handleSucesso(UsuarioTO result) {
                            montaInscricaoUsuario(result);
                        }

                        @Override
                        public void handleErro(Throwable caught) {
                            showLoading(false);
                            controladoraUsuario.setMensagemErro("ViewListaConferencia HandlerClickListaConferencia handle controladoraLogin obterUsuariosConferencia HandlerObterUsuariosConferencia handleSucesso controladoraConferencia obterListaAreasConferencia HandlerObterListaAreasConferencia handleSucesso controladoraLogin obterUsuario HandlerObterUsuario handleErro" + caught.getMessage());
                        }
                    });
                }

                @Override
                public void handle(ConferenciaTO to) {
                    showLoading(true);
                    conferencia = to;
                    controladoraUsuario.getMensagemWidget().limparMensagem();
                    controladoraUsuario.obterParticipacoesConferencia(conferencia, new UsuarioListener.HandlerObterParticipacoesConferencia() {

                        @Override
                        public void handleSucesso(List<UsuarioTO> result) {
                            participacoesConferencia = result;
                            boolean haPerfil = viewInscricaoUsuarioConferencia.montarPerfis(participacoesConferencia);
                            if (haPerfil) {
                                if (participacoesConferencia.isEmpty()) {
                                    obterUsuarioMontaInscricaoUsuario();
                                } else {
                                    montaInscricaoUsuario(participacoesConferencia.get(0));
                                }
                            } else {
                                showLoading(false);
                                controladoraUsuario.setMensagemErro(myConstants.usuarioIncritoAllPerfils());
                            }
                        }

                        @Override
                        public void handleErro(Throwable caught) {
                            controladoraUsuario.setMensagemErro(caught.getMessage());
                        }
                    });

                }
            });
    private ViewInscricaoUsuarioConferencia viewInscricaoUsuarioConferencia = new ViewInscricaoUsuarioConferencia(myConstants.inscricaoConferencia(), 1).addH(
            new ButtonCampoForm("<i>" + myConstants.limparDados() + "</i>", new ClickHandler() {

        @Override
        public void onClick(ClickEvent event) {
            controladoraUsuario.getMensagemWidget().limparMensagem();
            viewInscricaoUsuarioConferencia.clear();
        }
    })).addH(
            new ButtonCampoForm("<i>" + myConstants.confirmarInscricao() + "</i>", new ClickHandler() {

        private void inscrever(UsuarioTO usuarioInput) {
            controladoraUsuario.inscrever(usuarioInput, conferencia.getId(), new UsuarioListener.HandlerInscrever() {

                @Override
                public void handleSucesso(UsuarioTO usuarioOutput) {
                    usuario = usuarioOutput;
                    controladoraUsuario.setMensagemSucesso(myConstants.inscricaoRealizadaSucesso());
                    panelTabOpcoes.selectTab(0);
                    showLoading(false);
                }

                @Override
                public void handleErro(Throwable caught) {
                    controladoraUsuario.setMensagemErro(caught.getMessage());
                    showLoading(false);
                }
            });
        }

        private void obterUsernameInscrever() {
            controladoraUsuario.obterUsername(new UsuarioListener.HandlerObterUsername() {

                @Override
                public void handleSucesso(String result) {
                    UsuarioTO to = viewInscricaoUsuarioConferencia.criar(null, result);
                    inscrever(to);

                }

                @Override
                public void handleErro(Throwable caught) {
                    controladoraUsuario.setMensagemErro(caught.getMessage());
                    showLoading(false);
                }
            });
        }

        @Override
        public void onClick(ClickEvent event) {
            controladoraUsuario.getMensagemWidget().limparMensagem();
            showLoading(true);
            List<String> msgs = viewInscricaoUsuarioConferencia.validate();
            if (msgs.isEmpty()) {
                if (usuario == null) {
                    obterUsernameInscrever();
                } else {
                    UsuarioTO to = viewInscricaoUsuarioConferencia.criar(usuario.getPessoa(), usuario.getUsername());
                    inscrever(to);
                }
            } else {
                for (String string : msgs) {
                    controladoraUsuario.setMensagemErro(string);
                }
            }

        }
    }));
    //
    //recursos Inscricao UI
    
    //recursos Conferencia UI

    /**
     *
     * @param usuario
     * @param controladora
     * @param conferenciaCtrl
     */
    public InscricaoScreen(final UsuarioListener controladoraUsuario,
            final ConferenciaListener controladoraConferencia,
            final UsuarioListener controladoraLogin) {
        super();
        this.controladoraConferencia = controladoraConferencia;
        this.controladoraUsuario = controladoraUsuario;

        this.initWidget(super.initPanel(controladoraConferencia));
        showLoading(true);
        controladoraConferencia.listarConferenciasAbertas(new ConferenciaListener.HandlerListarConferenciasAbertas() {

            @Override
            public void handleSucesso(List<ConferenciaTO> listTo) {
                showLoading(false);
                if (listTo.isEmpty()) {
                    controladoraConferencia.setMensagemErro(myConstants.naoHaConferenciaDisponivelInscricao());
                } else {
                    viewListaConferencia.montar(listTo);
                }
            }

            @Override
            public void handleErro(Throwable caught) {
                showLoading(true);
                controladoraConferencia.setMensagemErro("InscricaoScreen " + caught.getMessage());
            }
        });



    }

    @Override
    public void load() {
        this.controladoraUsuario.getMensagemWidget().limparMensagem();
        this.panelTabOpcoes.selectTab(0);
        this.conferencia = null;
        this.participacoesConferencia = null;

    }

    @Override
    protected DecoratedTabPanel initPanelTabOpcoes() {
        panelTabOpcoes = new DecoratedTabPanel();
        panelTabOpcoes.add(viewListaConferencia, viewListaConferencia.getStrTabTitle());
        panelTabOpcoes.add(viewInscricaoUsuarioConferencia, viewInscricaoUsuarioConferencia.getStrTabTitle());



        viewInscricaoUsuarioConferencia.getStrTabTitle().setVisible(false);
        panelTabOpcoes.selectTab(0);
        panelTabOpcoes.setWidth("750px");
        panelTabOpcoes.setAnimationEnabled(true);
        panelTabOpcoes.addSelectionHandler(new SelectionHandler() {

            @Override
            public void onSelection(SelectionEvent event) {
                Integer item = (Integer) event.getSelectedItem();
                if (item == 0) {
//                	Window.alert("Atividade 2 \n\n" +
//                			"  Implementar aqui:\n"+
//                			" viewInscricaoUsuarioConferencia.getStrTabTitle().setVisible(false) \n" +
//                			" conferencia = null;\n\n" +
//                			"Questoes\n" +
//                			" 1 - Por que atribuir  \"viewInscricaoUsuarioConferencia.getStrTabTitle().setVisible(false)\" ?\n" +
//                			" 2 - Por que atribuir \"conferencia = null\" ?");
                    viewInscricaoUsuarioConferencia.getStrTabTitle().setVisible(false);
                    conferencia = null;
                } else {
                    if (item == 1) {
//                    	Window.alert("Atividade 3 \n\n" +
//                    			"  Implementar aqui:\n"+
//                    			" Se conferencia == null \n" +
//                    			"  \t panelTabOpcoes.selectTab(0) \n" +
//                    			"  \t controladoraConferencia.setMensagemErro(\"Selenione uma Confer\u00eancia\") \n" +
//                    			" senao \n" +
//                    			"  \t viewInscricaoUsuarioConferencia.getStrTabTitle().setVisible(true);");
                        if (conferencia == null) {
                            panelTabOpcoes.selectTab(0);
                            controladoraConferencia.setMensagemErro(myConstants.selecionaUmaConferencia());
                        } else {
                            viewInscricaoUsuarioConferencia.getStrTabTitle().setVisible(true);
                        }

                    }
                }

            }
        });
        return panelTabOpcoes;
    }
}
